<?php

namespace application\modules\mobile\controllers;


use application\core\utils\Attach;
use application\core\utils\Env;
use application\core\utils\File;
use application\core\utils\IBOS;
use application\core\utils\String;
use application\modules\assignment\core\AssignmentOpApi;
use application\modules\assignment\model\Assignment;
use application\modules\assignment\model\AssignmentApply;
use application\modules\assignment\model\AssignmentLog;
use application\modules\assignment\model\AssignmentRemind;
use application\modules\assignment\utils\Assignment as AssignmentUtil;
use application\modules\assignment\controllers\DefaultController;
use application\modules\dashboard\model\Stamp;
use application\modules\user\model\User;
use application\modules\calendar\model\Calendars;
use CJSON;

class AssignmentController extends DefaultController {
    /**
     * ICAPPLICATION组件会调用各控制器的此方法进行验证，子类可重写这个实现各自的验证
     * 规则
     * @param string $routes
     * @return boolean
     */
    public function filterRoutes( $routes ) {
        return true;
    }

    /**
     * 添加任务
     */
    public function actionAdd() {
		$this->beforeSave( $_POST ); // 空值判断
		$_POST['uid'] = IBOS::app()->user->uid;
		$assignmentId = AssignmentOpApi::getInstance()->addAssignment( $_POST );
		$assignment = Assignment::model()->fetchByPk( $assignmentId );
		$returnData = array(
			'charge' => User::model()->fetchByUid( $assignment['chargeuid'] ),
			'id' => $assignmentId,
			'subject' => $assignment['subject'],
			'time' => date( 'm月d日 H:i', $assignment['starttime'] ) . '--' . date( 'm月d日 H:i', $assignment['endtime'] )
		);
		$this->ajaxReturn( array( 'isSuccess' => true, 'data' => $returnData ) );
    }

    /**
     * 编辑任务
     */
    public function actionEdit() {
    	$uid = IBOS::app()->user->uid;
    	if(IBOS::app()->request->getIsPostRequest()) {
    		$assignmentId = intval( Env::getRequest( 'id' ) );
    		$assignment = Assignment::model()->fetchByPk( $assignmentId );
    		$this->beforeSave( $_POST ); // 空值判断
    		$data = AssignmentUtil::handlePostData( $_POST );
    		$data['updatetime'] = TIMESTAMP;
    		$updateSuccess = Assignment::model()->updateByPk( $assignmentId, $data );
    		if ( $updateSuccess ) {
    			$opApi = AssignmentOpApi::getInstance();
    			// 更新附件
    			Attach::updateAttach( $data['attachmentid'] );
    			// 如果修改了负责人，发送消息提醒
    			if ( $data['chargeuid'] != $assignment['chargeuid'] ) {
    				$chargeuid = String::getId( $_POST['chargeuid'] );
    				$participantuid = String::getId( $_POST['participantuid'] );
    				$uidArr = array_merge( $participantuid, $chargeuid );
    				$opApi->sendNotify( $uid, $assignmentId, $data['subject'], $uidArr, 'assignment_new_message' );
    			}
    			// 发表一条编辑评论
				$opApi->addStepComment( $uid, $assignmentId, IBOS::lang( 'Eidt the assignment', 'assignment.default' ) );
    			// 记录日志
				AssignmentLog::model()->addLog( $uid, $assignmentId, 'edit', IBOS::lang( 'Eidt the assignment', 'assignment.default' ) );
    			$this->ajaxReturn( array( 'isSuccess' => true, 'msg' => IBOS::lang( 'Update succeed', 'message' ) ) );
    		} else {
    			$this->ajaxReturn( array( 'isSuccess' => false, 'msg' => IBOS::lang( 'Update failed', 'message' ) ) );
    		}
    	} else {
			$assignmentId = intval( Env::getRequest( 'id' ) );
			$checkRes = $this->checkAvailableById( $assignmentId );
			if ( !$checkRes['isSuccess'] ) {
				$this->ajaxReturn( $checkRes );
			}
			$assignment = Assignment::model()->fetchByPk( $assignmentId );
			// 只有发起人有权编辑任务
			if ( $uid != $assignment['designeeuid'] ) {
				$this->ajaxReturn( array( 'isSuccess' => false, 'msg' => IBOS::lang( 'You donot have permission to edit' ) ) );
			}
			// 附件
			if ( !empty( $assignment['attachmentid'] ) ) {
				$assignment['attachs'] = Attach::getAttach( $assignment['attachmentid'] );
			}
			$assignment['starttime'] = empty( $assignment['starttime'] ) ? '' : date( 'Y-m-d H:i', $assignment['starttime'] );
			$assignment['endtime'] = empty( $assignment['endtime'] ) ? '' : date( 'Y-m-d H:i', $assignment['endtime'] );
			$assignment['chargeuid'] = String::wrapId( $assignment['chargeuid'] );
			$assignment['participantuid'] = String::wrapId( $assignment['participantuid'] );
			$assignment['lang'] = IBOS::getLangSource( 'assignment.default' );
			$assignment['assetUrl'] = IBOS::app()->assetManager->getAssetsUrl( 'assignment' );
			// $editAlias = 'application.modules.assignment.views.default.edit';
			// $editView = $this->renderPartial( $editAlias, $assignment, true );
			// echo $editView;
			$this->ajaxReturn(array( 'isSuccess' => true, 'data' => $assignment ));
    	}
    }

    /**
     * 任务详细页
     */
    public function actionShow() {
        $op = Env::getRequest( 'op' );
        $uid = IBOS::app()->user->uid;
        if ( empty( $op ) ) {
            $assignmentId = intval( Env::getRequest( 'assignmentId' ) );
            // 参数检查
            $checkRes = $this->checkAvailableById( $assignmentId );
            if ( !$checkRes['isSuccess'] ) {
                $this->error( $checkRes['msg'], $this->createUrl( 'unfinished/index' ) );
            }
            $assignment = Assignment::model()->fetchByPk( $assignmentId );
            // 权限检查
            if ( !$this->checkShowPermissions( $assignment ) && !$this->checkIsSup( $assignment ) ) {
                $this->error( IBOS::lang( 'You donot have permission to view' ), $this->createUrl( 'unfinished/index' ) );
            }
            // 取出附件
            if ( !empty( $assignment['attachmentid'] ) ) {
                $assignment['attach'] = Attach::getAttach( $assignment['attachmentid'] );
            }
            // 图章
            if ( !empty( $assignment['stamp'] ) ) {
                $assignment['stampUrl'] = Stamp::model()->fetchStampById( $assignment['stamp'] );
            }
            // 拿出延期、取消申请记录
            $apply = AssignmentApply::model()->fetchByAttributes( array( 'assignmentid' => $assignmentId ) );
            $applyData = $this->handleApplyData( $assignmentId, $apply );
            // 是否指派人(用于此任务延期、取消处理)
            $isDesigneeuid = $this->checkIsDesigneeuid( $assignment['designeeuid'] );
            // 是否负责人
            $isChargeuid = $this->checkIsChargeuid( $assignment['chargeuid'] );
            // 如果是未读状态，改变成进行中
            if ( $isChargeuid && $assignment['status'] == 0 ) {
                Assignment::model()->modify( $assignmentId, array( 'status' => 1 ) );
                $assignment['status'] = 1;
            }
            // 记录日志
            AssignmentLog::model()->addLog( $uid, $assignmentId, 'view', IBOS::lang( 'View the assignment' ) );
            // 参与人
            $participantuidArr = explode( ',', $assignment['participantuid'] );
            $participantuid = array_filter( $participantuidArr, create_function( '$v', 'return !empty($v);' ) );
            $reminds = AssignmentRemind::model()->fetchAllByUid( $uid);
            $assignment['remindtime'] = in_array( $assignmentId, array_keys( $reminds ) ) ? $reminds[$assignmentId] : 0;
            $params = array(
                'isDesigneeuid' => $isDesigneeuid,
                'isChargeuid' => $isChargeuid,
                'designee' => User::model()->fetchByUid( $assignment['designeeuid'] ), // 发起人
                'charge' => User::model()->fetchByUid( $assignment['chargeuid'] ), // 负责人
                'participantCount' => count( $participantuid ),
                'participant' => User::model()->fetchRealnamesByUids( $participantuid, '、' ),
                'assignment' => AssignmentUtil::handleShowData( $assignment ),
                'applyData' => $applyData
            );

            $this->ajaxReturn( array(
                'isSuccess' => 1,
                'data' => $params,
                'stamps' => $this->getStamps()
            ) );
        } else {
            $this->$op();
        }
    }

}
